package com.learning.spring.optimize.message;

import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * ClassName: Message
 * Description: 国际化
 * Date: 2018/8/8 17:24 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class Message {

    public static void main(String[] args) {
//        test2();
//        test3();
//        test4();
        test5();
    }

    /**
     * 基础功能：语言类型、国家/地区类型
     * 1、Locale：本地化对象
     * 中文： zh TW（中国台湾） CN（中国大陆）
     */
    static void test() {


        Locale locale = new Locale("zh", "CN");
        Locale china = Locale.CHINA;

        // 只有语言信息的本地化对象
        Locale locale2 = new Locale("zh");
        Locale chinese = Locale.CHINESE;

        // 获取本地系统默认的本地化对象
        Locale aDefault = Locale.getDefault();

        // JVM 设置本地化参数
//        java -Duser.language=cn -Duser.region-US

    }

    /**
     * 2、本地化工具类：NumberFormat、DateFormat、MessageFormat(占位符功能)
     */
    static void test2() {
        Locale locale = new Locale("zh", "CN");
        NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(locale);

        String format = currencyInstance.format(12345.98);
        // ￥12,345.98
        System.out.println(format);


        DateFormat dateInstance = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
        String date = dateInstance.format(new Date());
        // 2018-8-22
        System.out.println(date);


        // MessageFormat(占位符功能)
        String pattern = "{0}, 你好！{1}";

        String[] args = {"Sam", "MessageFormat 的功能"};
        MessageFormat messageFormat = new MessageFormat(pattern, locale);
        String msg = messageFormat.format(args);

        // Sam, 你好！MessageFormat 的功能
        System.out.println(msg);
    }

    /**
     * 1、国际化资源文件的命名规范：<资源名>_<语言代码>_<国家/地区代码>.properties，语言代码、国家/地区代码 是可选的
     * <资源名>.properties 是默认的资源文件
     * <资源名>_<语言代码>.properties 是某一个语言默认的资源文件
     * <p>
     * 2、资源文件只能包含 ASCII 字符，使用 Unicode 编码。正常中文使用JDK bin目录下的 native2ascii 工具转换
     * native2ascii [-reverse] [-encoding 编码] [输入文件] [输出文件]
     * 示例：native2ascii -encoding utf-8 resource_zh_CN.properties resource_zh_CN_2.properties
     * <p>
     * <p>
     * 3、Idea 插件可以方便开发：Setting - Editor - File Encoding - 勾选 Transparent native-to-ascii conversion
     * <p>
     * <p>
     * 4、如果程序中有大量，使用File加载套麻烦，Java提供了加载本地化资源文件的类 java.util.ResourceBundle
     */
    static void test3() {
        ResourceBundle bundle = ResourceBundle.getBundle("messages.messages", Locale.getDefault());
        System.out.println(bundle.getString("button.submit"));


        ResourceBundle bundle2 = ResourceBundle.getBundle("messages.messages", Locale.ENGLISH);
        System.out.println(bundle2.getString("button.submit"));

        /*
            输出：
            提交
            Submit
        */
    }

    /**
     * 1、Spring 定义了访问国际化信息的 org.springframework.context.MessageSource 接口
     * 方法:
     * String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
     * <p>
     * 2、实现类：
     * HierarchicalMessageSource：建立父子层级的 MessageSource 结构
     * - ResourceBundleMessageSource：
     * - ReloadableResourceBundleMessageSource：提供定时刷新功能
     * ApplicationContext
     * <p>
     */
    static void test4() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        MessageSource messageSource = (MessageSource) context.getBean("messageSource");

        String message = messageSource.getMessage("button.submit", null, Locale.getDefault());
        // 提交
        System.out.println(message);
    }


    /**
     * 2、容器级的国际化信息资源
     * ApplicationContext 实现了 MessageSource
     * <p>
     * 容器启动的refresh()方法中 initMessageSource(); 初始化同期中的国际化资源
     */
    static void test5() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        String message = context.getMessage("button.submit", null, Locale.getDefault());
        System.out.println(message);
    }
}
